package club.kingyin.easycache.component;

import club.kingyin.easycache.cache.AbstractCache;
import club.kingyin.easycache.method.CacheMethod;

/**
 * Cache流程后置处理器，在获取缓存之后的增强操作
 * :cache(获取)-before(前置增强)-pre(打断操作)-saveCache(保存缓存)-after(后置增强)
 */
public interface CachePostProcess extends PostProcess {

    /**
     * 保存前置处理，可对缓存是时间进行设定
     * 例：以[0.7,1]动态时间存储，即可避免缓存雪崩问题
     * 
     * @param invocation 目标方法
     * @param value 方法结果
     * @param timer 缓存时间
     */
    void postProcessBeforeSetCache(CacheMethod invocation, Object value, Timer timer);

    /**
     * 保存后置处理，可对缓存进行后置增强
     * 例：写入分析平台进行缓存分析等等
     * 例：对缓存进行猜想式写入，类似操作系统中Cache命中，把数据块附近的数据一并写入缓存
     *
     * @param invocation 目标方法
     * @param value 方法结果
     * @param cache 缓存中心
     * @return 缓存
     */
    Object postProcessAfterSetCache(CacheMethod invocation, Object value, AbstractCache cache);

    /**
     * 保存前置处理，对方法结果进行分析，此扩展可处理缓存穿透问题
     * 例：业务抛出异常信息，即请求可能受到攻击，此时替换方法结果为空或其他数据写入缓存
     * 例：业务抛出异常并非都是受到攻击，若果是网络异则不需要存储异常缓存
     *
     * @param invocation 目标方法
     * @param value 方法结果
     * @param timer 缓存时间
     * @return 打断条件
     */
    default boolean postProcessPreSetCache(CacheMethod invocation, Object value, Timer timer) {
        return true;
    }
}
